/**
 * @file AccountType.h
 * @author 严一涵 (yyhhenry@foxmail.com)
 * @brief 账号管理
 * @version 0.1
 * @date 2022-05-11
 *
 * @copyright Copyright (c) 2022
 *
 */
#ifndef ACCOUNTTYPE_H_YYH
#define ACCOUNTTYPE_H_YYH
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./ListType.h"
#include "./StrFunc.h"

/**
 * @brief 借阅卡类型
 * @author 严一涵
 */
typedef struct AccountType
{
    /**
     * @brief 借阅卡号
     *
     */
    char *id;
    /**
     * @brief 借阅人姓名
     *
     */
    char *name;
    /**
     * @brief 借阅数量限制
     *
     */
    int limit;
    /**
     * @brief 已经借阅的数量
     *
     */
    int count;
    /**
     * @brief 借阅密码
     *
     */
    char *password;
} AccountType;

/**
 * @brief AccountType构造
 * @author 严一涵
 * @param str CSV格式的一行字符串
 */
AccountType *AccountType_AccountType(const char *str);

/**
 * @brief 链表对AccountType的支持
 * @author 严一涵
 */
AccountType *AccountType_ListNode(ListNode *p);

/**
 * @brief AccountType转为CSVStr
 * @author 严一涵
 */
char *AccountType_toCSVStr(AccountType *account);

/**
 * @brief AccountType销毁
 * @author 严一涵
 */
void AccountType_free(void *_account);

/**
 * @brief AccountListType绑定一个文件的账户链表
 * @author 严一涵
 */
typedef struct AccountListType
{
    char *filename;
    ListType *list;
} AccountListType;

const char *const AccountSheetTitle;

/**
 * @brief 给定文件名并生成AccountListType，默认调用一次read
 * @author 严一涵
 * @param _filename 文件名
 */
AccountListType *AccountListType_AccountListType(const char *_filename);

/**
 * @brief AccountListType销毁
 * @author 严一涵
 * @param accountList 所有权销毁，禁止外部使用
 */
void AccountListType_free(AccountListType *accountList);

/**
 * @brief AccountListType文件读入
 * @author 严一涵
 */
void AccountListType_read(AccountListType *accountList);

/**
 * @brief AccountListType文件写入
 * @author 严一涵
 */
void AccountListType_write(AccountListType *accountList);

/**
 * @brief 通用查询（id相等或name相等）
 * @author 严一涵
 */
ListNode *AccountListType_query(AccountListType *accountList, const char *id);
#endif
